home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / GRAPHICS.SWG / 0049_GIF Code.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  6KB  |  298 lines

  1. {
  2. > Does anyone have ANY source, on how to display a gif in VGA mode
  3.  
  4. It's as bad as ... but it works.
  5.  
  6. --- VGA gif loader part 1 of 3 ---
  7. }
  8.  
  9. {$X+}
  10.  
  11. Uses Graph,Dos;
  12.  
  13. Var
  14.   Gd,Gm: Integer;
  15.   Datei: File;
  16.   palette: array[0..767] of byte;
  17.   buffer: array[0..1279] of byte;
  18.   prefix,tail: array[0..4095] OF WORD;
  19.   keller: array[0..640] of Word;
  20.  
  21. Function LoadGif(N: String; VersX,VersY: Word): Integer;
  22.  
  23. Function GetChar: Char;
  24. Var C: Char;
  25. Begin
  26.   BlockRead(Datei,C,1);
  27.   GetChar:=C;
  28. End;
  29.  
  30. Function GetByte: Byte;
  31. Var B: Byte;
  32. Begin
  33.   BlockRead(Datei,B,1);
  34.   GetByte:=B;
  35. End;
  36.  
  37. Function GetWord: Word;
  38. Var W: Word;
  39. Begin
  40.   BlockRead(Datei,W,2);
  41.   Getword:=W;
  42. End;
  43.  
  44. Procedure AGetBytes(Anz: Word);
  45. Begin
  46.   BlockRead(Datei,Buffer,Anz);
  47. End;
  48.  
  49. Var
  50.   lokal_farbtafel: Integer;
  51.   mask,restbytes,pp,lbyte,blocklen,code,oldcode,sonderfall,
  52.   incode,freepos,kanz,pass,clearcode,eofcode,maxcode,infobyte,
  53.   globalfarbtafel,backcolor,interlace,bilddef,abslinks,absoben: word;
  54.   bits,restbits,codesize: Byte;
  55.   rot,gruen,blau,by,bpp: Byte;
  56.   z,i,x1,y1,x2,y2: integer;
  57.   bem: string[6];
  58.   farben: integer;
  59.   x,y,xa,ya,dy: word;
  60. begin
  61.   loadgif:=0;
  62.   Assign(Datei,N);
  63.   reset(Datei,1);
  64.   if ioresult>0 then begin loadgif:=1; exit; end;
  65.   bem:='';
  66.   for i:=1 to 6 do bem:=bem+getchar;
  67.   if copy(bem,1,3)<>'GIF' then begin loadgif:=2; exit; end;
  68.   x2:=getword;
  69.   y2:=getword;
  70.   infobyte:=getbyte;
  71.   globalfarbtafel:=infobyte and 128;
  72.   bpp:=(infobyte and 7)+1;
  73.   farben:=1 shl bpp;
  74.   backcolor:=getbyte;
  75.   by:=getbyte;
  76.   if globalfarbtafel<>0 then
  77.     for i:=0 to (3*farben)-1 do
  78.       palette[i]:=getbyte shr 2;
  79.   bilddef:=getbyte;
  80.   while bilddef=$21 do begin
  81.     by:=getbyte; z:=getbyte;
  82.     for i:=1 to z do by:=getbyte;
  83.     by:=getbyte;
  84.     bilddef:=getbyte;
  85.   end;
  86.  
  87.  
  88.   if bilddef<>$2c then begin loadgif:=3; exit; end;
  89.   abslinks:=getword+VersX;
  90.   absoben:=getword+VersY;
  91.   x2:=getword;
  92.   y2:=getword;
  93.   by:=getbyte;
  94.   lokal_farbtafel:=by and 128;
  95.   interlace:=by and 64;
  96.   by:=getbyte;
  97.   x1:=0; y1:=0; xa:=x2; Ya:=Y2;
  98.   if farben<16 then begin loadgif:=4; exit; end;
  99.   if lokal_farbtafel<>0 then
  100.     for i:=0 to 3*Farben-1 do
  101.       palette[I]:=getbyte shr 2;
  102.   asm
  103.     mov ax,$1012
  104.     push ds
  105.     pop es
  106.     xor bx,bx
  107.     mov cx,256
  108.     lea dx,palette
  109.     int $10
  110.     mov pass,0
  111.     MOV CL,bpp
  112.     MOV AX,1
  113.     SHL AX,CL
  114.     MOV clearcode,AX
  115.     INC AX
  116.     MOV eofcode,AX
  117.     INC AX
  118.     MOV freepos,AX
  119.     MOV AL,bpp
  120.     MOV AH,0
  121.     INC AX
  122.     MOV codesize,AL
  123.     MOV CX,AX
  124.     MOV AX,1
  125.     SHL AX,CL
  126.     DEC AX
  127.     MOV maxcode,AX
  128.     MOV kanz,0
  129.     MOV dy,8
  130.     MOV restbits,0
  131.     MOV restbytes,0
  132.     MOV x,0
  133.     MOV y,0
  134. @gif0: CALL FAR PTR @getgifbyte
  135.     CMP AX,eofcode
  136.     je @ende1
  137. @gif1: CMP AX,clearcode
  138.     je @reset1
  139. @gif3: MOV AX,code
  140.     MOV incode,AX
  141.     CMP ax,freepos
  142.     jb @gif4
  143.     MOV AX,oldcode
  144.     MOV code,AX
  145.     MOV BX,kanz
  146.     MOV CX,sonderfall
  147.     SHL BX,1
  148.     MOV [OFFSET keller+BX],CX
  149.     INC kanz
  150. @gif4: CMP AX,clearcode
  151.     JB @gif6
  152. @gif5: MOV BX,code
  153.     SHL BX,1
  154.     PUSH BX
  155.     MOV AX,[Offset tail+BX]
  156.     MOV BX,kanz
  157.     SHL BX,1
  158.     MOV [OFFSET keller+BX],AX
  159.     INC kanz
  160.     POP BX
  161.     MOV AX,[Offset prefix+BX]
  162.     MOV code,AX
  163.     CMP AX,clearcode
  164.     ja @gif5
  165. @gif6: MOV BX,kanz
  166.     SHL BX,1
  167.     MOV [Offset keller+BX],AX
  168.     MOV sonderfall,AX
  169.     INC kanz
  170. @gif7: MOV AX,[Offset keller+BX]
  171.     CALL FAR PTR @pixel
  172.     CMP BX,0
  173.     JE @gif8
  174.     DEC BX
  175.     DEC BX
  176.     JMP @gif7
  177.  
  178. @gif8: MOV kanz,0
  179.     MOV BX,freepos
  180.     SHL BX,1
  181.     MOV AX,oldcode
  182.     MOV [Offset prefix+BX],AX
  183.     MOV AX,code
  184.     MOV [Offset tail+BX],AX
  185.     MOV AX,incode
  186.     MOV oldcode,AX
  187.     INC freepos
  188.     MOV AX,freepos
  189.     CMP AX,maxcode
  190.     JBE @gif2
  191.     CMP codesize,12
  192.     JAE @gif2
  193.     INC codesize
  194.     MOV CL,codesize
  195.     MOV AX,1
  196.     SHL AX,CL
  197.     DEC AX
  198.     MOV maxcode,AX
  199. @gif2: JMP @gif0
  200. @ende1: JMP @ende
  201. @reset1: MOV AL,bpp
  202.     MOV AH,0
  203.     INC AX
  204.     MOV codesize,AL
  205.     MOV CX,AX
  206.     MOV AX,1
  207.     SHL AX,CL
  208.     DEC AX
  209.     MOV maxcode,AX
  210.     MOV AX,clearcode
  211.     ADD AX,2
  212.     MOV freepos,AX
  213.     CALL FAR PTR @getgifbyte
  214.     MOV sonderfall,AX
  215.     MOV oldcode,AX
  216.     CALL FAR PTR @pixel
  217.     JMP @gif2
  218. @getgifbyte: MOV DI,0
  219.     MOV mask,1
  220.     MOV bits,0
  221. @g1: MOV AL,bits
  222.     CMP AL,codesize
  223.     JAE @g0
  224.     CMP restbits,0
  225.     JA @g2
  226.     CMP restbytes,0
  227.     JNE @l2
  228.     PUSH DI
  229.     CALL Getbyte
  230.     POP DI
  231.     MOV blocklen,AX
  232.     MOV restbytes,AX
  233.     PUSH DI
  234.     PUSH AX
  235.     CALL AGetbytes
  236.     POP DI
  237.     MOV pp,0
  238. @l2: MOV BX,pp
  239.     MOV AL,[BX+Offset Buffer]
  240.     XOR AH,AH
  241.     INC pp
  242.     DEC restbytes
  243.     MOV lbyte,AX
  244.     MOV restbits,8
  245. @g2: SHR lbyte,1
  246.     JNC @nocarry
  247.     OR DI,mask
  248. @nocarry: INC bits
  249.     DEC restbits
  250.     SHL mask,1
  251.     JMP @g1
  252. @g0:MOV bits,0
  253.     MOV code,DI
  254.     MOV AX,DI
  255.     RETF
  256. @pixel:
  257.     PUSH BX
  258.     MOV BX,x
  259.     ADD BX,abslinks
  260.     PUSH BX
  261.     MOV BX,y
  262.     ADD BX,absoben
  263.     PUSH BX
  264.     PUSH AX
  265.     CALL Putpixel
  266.     POP BX
  267.     INC x
  268.     MOV AX,x
  269.     CMP AX,x2
  270.     JB @s0
  271.     MOV x,0
  272.     CMP interlace,0
  273.     JNE @s1
  274.     INC y
  275.     JMP @s0
  276. @s1: MOV AX,dy
  277.     ADD y,AX
  278.     MOV AX,y
  279.     CMP AX,y2
  280.     JB @s0
  281.     INC pass
  282.     CMP pass,1
  283.     JNE @s3
  284.     JMP @s2
  285. @s3: SHR dy,1
  286. @s2: MOV AX,DY
  287.     SHR AX,1
  288.     MOV Y,AX
  289. @s0: RETF
  290. @ende:
  291.   End;
  292.   Close(Datei);
  293. End;
  294.  
  295.  
  296. begin
  297.  
  298. end.